'''
8.1 面向对象概述
    面向过程:面向过程是早起开发语言中大量使用的编程思想,基于这种思想开发程序时一般会先分析解决问题的步骤,
使用函数实现每个步骤的功能,之后按步骤依次调用函数.面向过程只考虑函数中封装的代码逻辑,而不会考虑函数的归属关系.
    面向对象:关注的不是解决问题的过程,基于面向对象思想开发程序时会先分析问题,从中提炼出多个对象,将不同对象
各自的特征和行为进行封装,之后通过控制对象的行为来解决问题.
'''
'''
下面通过一个五子棋游戏感受面向过程编程和面向对象编程的区别
1.基于面向过程的分析
五子棋游戏的过程可以拆分为以下步骤
    1.开始游戏
    2.绘制棋盘画面
    3.落黑子
    4.绘制棋盘落子画面
    5.判断输赢:赢则结束游戏,否则向下执行
    6.落白子
    7.绘制棋盘落子画面
    8.判断输赢:赢则结束游戏,否则返回步骤2
以上每个步骤的操作都可以封装为一个函数,按以上步骤逐个调用函数,即可实现一个五子棋游戏

2. 基于面向对象的分析
    五子棋以空棋盘开局,由执黑子的玩家优先在空棋盘上落子,执白子的玩家随后落子,如此黑白玩家交替落子,棋盘
实时更新游戏画面,规则系统时刻判断棋盘的输赢情况.
    根据以上分析可知,五子棋游戏中可以提炼出3类对象:玩家,棋盘和规则系统
    1.玩家:黑白双方,负责决定落子的位置
    2.棋盘:负责绘制当前的游戏画面,向玩家反馈棋盘的状况
    3.规则系统:负责判断游戏的输赢
    以上每类对象各自具有的特征和行为如表所示:
    对象        玩家         棋盘         规则系统
    特征        棋子(黑,白)   棋盘数据      无
    行为        落子         显示,更新棋盘  判定胜负
    每类对象都有自己的特征和行为,主程序通过对象其控制行为,每个对象既相互独立,又保持协作
    面向对象保证了功能的统一性,更便于后续代码的维护和功能扩展
'''
'''
8.2 类与对象的基础应用
    面向对象编程中有两个核心概念:类和对象.其中对象映射了现实生活中真实存在的事物,它可以看得见摸得着,
例如,你现在手里的这本书就是一个对象;类是抽象的,它是一群具有相同特征和行为的事物的统称,例如,"书是人来进步
的阶梯"中提到的数并不具体指哪一本,它就是一个类
    简单地说,类是现实中具有相同特征的一些事物的抽象,对象是类的实例.
'''
'''
8.2.1 类的定义
    现实生活中,一类事物具有相似的特征或行为,人们统称会对这一类事物进行命名以便区别于其他事物.同理,
程序中的类也有一个名称,也包含描述特征的数据成员,以及描述类行为的成员函数,其中数据成员称为属性,
成员函数称为方法.
'''
# Python用class关键字来定义一个类,语法格式如下
# class 类名:
#     属性名 = 属性值
#     def 方法名(self):
#         方法体
'''
    以上格式中的class关键字表示类的开始;类名代表类的标识符,使用大驼峰命名法,首字母一般为大写字母;
冒号是必不可少的;冒号之后跟着属性和方法,属性类似于前面章节中所学的变量,方法类似于前面章节中所学的函数,
但方法列表中的第一个参数是一个指代对象的默认参数self.
'''
# 下面定义一个表示轿车的Car类,该类中包含描述轿车车轮数量的属性wheels和描述轿车行驶行为的方法drive(),实例代码如下:
class Car:
    wheels = 4            # 属性
    def drive(self):      # 方法
        print('行驶')

'''
8.2.2 对象的创建与使用
    设计图可以帮助人们理解车的结构,但驾驶员若想要驾驶汽车,必须要有一辆根据设计图生产的汽车.类和对象的关系
就好比以上实例中的设计图和汽车.同理,程序若想要使用类,则需要根据类创建一个对象.
    创建对象的语法格式如下所示:
对象名 = 类名()
    例如,根据8.2.1定义的Car类创建一个对象,代码如下:
car = Car()
    对象的使用本质上就是对类或对象成员的使用,即访问属性或调用方法.访问属性或调用方法的语法格式如下:
对象名.属性名
对象名.方法名() 
'''
# 例如,使用car对象访问wheels属性,以及调用drive()方法,代码如下:
car = Car()
print(car.wheels)  # 访问属性
car.drive()        # 调用方法
